package cl.zeke.cursos.jsf2spring3jpa2.vista.managedbeans.gestionar_usuarios;

import cl.zeke.cursos.jsf2spring3jpa2.negocio.entities.Perfil;
import cl.zeke.cursos.jsf2spring3jpa2.negocio.entities.Usuario;
import cl.zeke.cursos.jsf2spring3jpa2.negocio.exceptions.LogicaNegocioException;
import cl.zeke.cursos.jsf2spring3jpa2.negocio.services.ComunesService;
import cl.zeke.cursos.jsf2spring3jpa2.negocio.services.UsuarioService;
import cl.zeke.cursos.jsf2spring3jpa2.util.ConstantesUtil;
import cl.zeke.java.commons.beansvalidators.annotations.Email;
import cl.zeke.java.commons.beansvalidators.annotations.Password;
import cl.zeke.java.commons.jsf2.Jsf2Util;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.validation.constraints.Size;
import org.primefaces.model.LazyDataModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

/**
 *
 * @author eduardo
 */

@Component
@Scope("flow")
public class GestionarUsuariosBean implements Serializable {
    
    private static Logger log = LoggerFactory.getLogger(GestionarUsuariosBean.class);
    
    @Autowired
    private UsuarioService usuarioService;
    
    @Autowired
    private ComunesService comunesService;
    
    private LazyDataModel<Usuario> usuarioLazyDataModel;
    private Usuario usuario;
    private String passwordConfirmacion;
    @Password
    private String password;
    private List<Perfil>  perfilList;
    
    /*datos del filtro*/
    
    @Size(max = 250)
    private String nombres;
    @Size(max = 250)
    private String apellidos;
    private Integer rut;
    private Perfil perfil;
    private Boolean habilitado;
    
    @Email
    private String email;
    private Date fechaNacimientoInferior;
    private Date fechaNacimientoSuperior;
    
    /* data auxiliar */
    private boolean modoEditar;
    private int filasPorPagina;
    
    public void iniciar() {
        log.debug("iniciando flow: gestionar_usuarios");
        usuarioLazyDataModel = null;
        usuario = null;
        passwordConfirmacion = null;
        nombres = null;
        apellidos = null;
        rut = null;
        perfil = null;
        usuarioLazyDataModel = new UsuarioLazyDataModel();
        filasPorPagina = 10;
        perfilList = comunesService.traerTodosLosPerfiles();
    }
    
    public void buscar() {
        log.debug("buscando usuarios");
        UsuarioLazyDataModel lazymodel = (UsuarioLazyDataModel) usuarioLazyDataModel;
        lazymodel.setHabilitado(habilitado);
        lazymodel.setApellidos(apellidos);
        lazymodel.setNombres(nombres);
        lazymodel.setPerfil(perfil);
        lazymodel.setRut(rut);
        lazymodel.setFechaNacimientoInferior(fechaNacimientoInferior);
        lazymodel.setFechaNacimientoSuperior(fechaNacimientoSuperior);
        lazymodel.setUsuarioService(usuarioService);
        lazymodel.setPageSize(filasPorPagina);
        lazymodel.calcularRowCount();
    }
    
    public void iniciarListar() {
        log.debug("iniciar listar");
        usuario = null;
    }
    
    public String irEditar(Usuario usuario) {
        log.debug("ir a editar");
        if(usuario == null) {
            this.usuario = new Usuario();
            modoEditar = false;
        }
        else {
            this.usuario = usuario;
            modoEditar = true;
        }
        return "ir_editar";
    }
    
    public String guardar() {
        
        //validacion password confirmacion
        boolean erroresValidacion = false;
        if(password != null && !password.isEmpty() && !password.equals(passwordConfirmacion)) {
            Jsf2Util.addErrorMessage("formUsuario:password", "Contraseña de confirmación incorrecta");
            erroresValidacion = true;
        }else if(password != null && !password.isEmpty()){
            usuario.setPassword(password);
        }
        
        if(erroresValidacion) {
            return null;
        }
        
        try {
            usuarioService.guardarUsuario(usuario);
            Jsf2Util.addInfoMessage(ConstantesUtil.MSJ_EXITO);
            return "exito";
        }catch(LogicaNegocioException ex) {
            Jsf2Util.addErrorMessage(ex.getMessage());
            return null;
        }
        catch(Exception ex) {
            log.error("error", ex);
            Jsf2Util.addErrorMessage(ConstantesUtil.MSJ_ERROR_INTERNO);
            return null;
        }
    }
    
    public void seleccionar(Usuario usuario) {
        this.usuario = usuario;
    }
    
    public void eliminar() {
        try {
            usuarioService.eliminar(usuario);
            buscar();
            Jsf2Util.addInfoMessage(ConstantesUtil.MSJ_EXITO);
        }catch(LogicaNegocioException ex) {
            Jsf2Util.addErrorMessage(ex.getMessage());
        }
        catch(Exception ex) {
            log.error("error", ex);
            Jsf2Util.addErrorMessage(ConstantesUtil.MSJ_ERROR_INTERNO);
        }
    }
    
    public void habilitar() {
        try {
            usuarioService.habilitar(usuario);
            Jsf2Util.addInfoMessage(ConstantesUtil.MSJ_EXITO);
        }catch(LogicaNegocioException ex) {
            Jsf2Util.addErrorMessage(ex.getMessage());
        }
        catch(Exception ex) {
            log.error("error", ex);
            Jsf2Util.addErrorMessage(ConstantesUtil.MSJ_ERROR_INTERNO);
        }
    }
    
    public void deshabilitar() {
        try {
            usuarioService.deshabilitar(usuario);
            Jsf2Util.addInfoMessage(ConstantesUtil.MSJ_EXITO);
        }catch(LogicaNegocioException ex) {
            Jsf2Util.addErrorMessage(ex.getMessage());
        }
        catch(Exception ex) {
            log.error("error", ex);
            Jsf2Util.addErrorMessage(ConstantesUtil.MSJ_ERROR_INTERNO);
        }
    }
    
    public void cargarPerfil() {
        Perfil perfilCreado = (Perfil)Jsf2Util.getSpElAttribute("flowScope.perfil");
        log.debug("El Nombre del Perfil Creado es: " + perfilCreado.getNombre());
        usuario.setPerfil(perfilCreado);
        perfilList = comunesService.traerTodosLosPerfiles();
    }
    
    /* getters and setters */
    
    public LazyDataModel<Usuario> getUsuarioLazyDataModel() {
        return usuarioLazyDataModel;
    }
    public void setUsuarioLazyDataModel(UsuarioLazyDataModel usuarioLazyDataModel) {
        this.usuarioLazyDataModel = usuarioLazyDataModel;
    }
    public Usuario getUsuario() {
        return usuario;
    }
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
    public String getNombres() {
        return nombres;
    }
    public void setNombres(String nombres) {
        this.nombres = nombres;
    }
    public String getApellidos() {
        return apellidos;
    }
    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public Integer getRut() {
        return rut;
    }
    public void setRut(Integer rut) {
        this.rut = rut;
    }
    public Perfil getPerfil() {
        return perfil;
    }
    public void setPerfil(Perfil perfil) {
        this.perfil = perfil;
    }
    public boolean isModoEditar() {
        return modoEditar;
    }
    public void setModoEditar(boolean modoEditar) {
        this.modoEditar = modoEditar;
    }
    public Date getFechaNacimientoInferior() {
        return fechaNacimientoInferior;
    }
    public void setFechaNacimientoInferior(Date fechaNacimientoInferior) {
        this.fechaNacimientoInferior = fechaNacimientoInferior;
    }
    public Date getFechaNacimientoSuperior() {
        return fechaNacimientoSuperior;
    }
    public void setFechaNacimientoSuperior(Date fechaNacimientoSuperior) {
        this.fechaNacimientoSuperior = fechaNacimientoSuperior;
    }
    public int getFilasPorPagina() {
        return filasPorPagina;
    }
    public String getPasswordConfirmacion() {
        return passwordConfirmacion;
    }
    public void setPasswordConfirmacion(String passwordConfirmacion) {
        this.passwordConfirmacion = passwordConfirmacion;
    }
    public List<Perfil> getPerfilList() {
        return perfilList;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Boolean getHabilitado() {
        return habilitado;
    }

    public void setHabilitado(Boolean habilitado) {
        this.habilitado = habilitado;
    }
}
